package com.project.utils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;

/**
 * 正则表达式工具类
 * 
 */
public class RegExUtil {

	/**
	 * 大陆手机号码11位数
	 */
	public static boolean isChinaPhoneLegal(String str) {
		boolean status = false;
		try {
			// String regExp =
			// "^((14[0-9])|(16[0-9])|(19[0-9])|(13[0-9])|(15[0-9])|(18[0-9])|(17[0-9]))\\d{8}$";
			String regExp = "^1\\d{10}$";
			Pattern p = Pattern.compile(regExp);
			Matcher m = p.matcher(str);
			status = m.matches();
		} catch (Exception e) {
			status = false;
		}
		return status;
	}

	/**
	 * 手机验证码，4位数字
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isSMSCaptcha(String str) {
		boolean status = false;
		if (str != null) {
			status = str.matches("^([0-9]{4})$");
		}
		return status;
	}

	/**
	 * 统一社会信用代码
	 * 
	 * 统一社会信用代码用18位的阿拉伯数字或大写英文字母表示
	 * 由登记管理部门代码（1位）、机构类别代码（1位）、登记管理机关行政区划码（6位）、主体标识码（组织机构代码）（9位）和校验码（1位）5个部分组成
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isUniscId(String str) {
		boolean status = false;
		if (str != null) {
			status = str.matches("^([A-Z0-9]{18})$");
		}
		return status;
	}

	/**
	 * 组织机构代码
	 * 
	 * 1.全国组织机构代码由八位数字（或大写拉丁字母）本体代码和一位数字（或大写拉丁字母）校验码组成。
	 * 
	 * 2.代码的表示形式 为便于人工识别，应使用一个连字符“—”分隔本体代码与校验码。机读时，连字符省略。表示形式为：xxxxxxxx—X
	 * 
	 * 3.自定义区 为满足各系统管理上的特殊需要，规定本体代码PDY00001至PDY99999为自定义区，供各系统编制内部组织机构代码使用。
	 * 自定义区内编制的组织机构代码不作为个系统之间信息交换的依据。
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isOrgCode(String str) {
		boolean status = false;
		if (str != null) {
			status = str.matches("^([A-Z0-9]{9})$");
		}
		return status;
	}

	/**
	 * 组织机构代码或统一社会信用代码
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isOrgCodeSocialID(String str) {
		boolean status = false;
		if (isOrgCode(str) || isUniscId(str)) {
			status = true;
		}
		return status;
	}

	/**
	 * 固定电话 区号+座机号码+分机号码
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isFixedTel(String str) {
		boolean status = false;
		if (str != null) {
			// String reg =
			// "(?:(\\(\\+?86\\))(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)|"//
			// 正则1
			// +
			// "(?:(86-?)?(0[0-9]{2,3}\\-?)?([2-9][0-9]{6,7})+(\\-[0-9]{1,4})?)";//
			// 正则2
			String reg = "^(\\d{3}-|\\d{4}-)(\\d{8}|\\d{7})$";
			status = str.matches(reg);
		}
		return status;
	}

	/**
	 * 电子邮箱
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isEMail(String str) {
		boolean status = false;
		if (str != null) {
			String reg = "^[a-zA-Z0-9_\\-]+[a-zA-Z0-9_\\-\\.]*@[a-zA-Z0-9_\\-]+(\\.[a-zA-Z0-9_\\-]+)+$";
			status = str.matches(reg);
		}
		return status;
	}

	/**
	 * 邮政编码
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isPostCode(String str) {
		boolean status = false;
		if (str != null) {
			String reg = "^\\d{6}$";
			status = str.matches(reg);
		}
		return status;
	}

	/**
	 * 正整数
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isInteger(String str) {
		boolean status = false;
		if (str != null) {
			String reg = "^\\d+$";
			status = str.matches(reg);
		}
		return status;
	}

	/**
	 * 密码，6至15位字符
	 * 
	 * @title
	 * @param password
	 * @return
	 * @author cc
	 */
	public static boolean isPassWord(String password) {
		boolean status = false;
		if (password != null) {
			String reg = "^([a-zA-Z0-9]){6,15}$";
			status = password.matches(reg);
		}
		return status;
	}

	/**
	 * 小数
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isDecimal(String str) {
		boolean status = false;
		if (str != null) {
			String reg = "^\\d+(\\.\\d+)?$";
			status = str.matches(reg);
		}
		return status;
	}

	/**
	 * 强密码
	 *
	 * @return
	 * @author chencheng
	 */
	public static boolean isPowerWord(String str) {
		boolean status = false;
		if (str != null) {
			String s1 = "[A-Za-z0-9!@#\\$%\\^&\\*]";
			String reg = "^(?=" + s1 + "*[0-9]" + s1 + "*)(?=" + s1 + "*[A-Z]" + s1 + "*)(?=" + s1 + "*[a-z]" + s1 + "*)(?=" + s1
					+ "*[!@#\\$%\\^&\\*]" + s1 + "*)" + s1 + "{8,16}$";

			status = str.matches(reg);
		}
		return status;
	}

	/**
	 * @Description 校验是否为JSON格式字符串
	 * @author cc@bornsoft.cn
	 * @date 2019年11月22日
	 */
	public static boolean isJSONArray(String str) {
		boolean status = false;

		try {
			if (StrUtil.isNotBlank(str)) {
				JSON.parseArray(str);
				status = true;
			}
		} catch (Exception e) {
			status = false;
		}

		return status;
	}

	/**
	 * @Description 校验是否为JSONObject格式
	 * @author cc@bornsoft.cn
	 * @date 2019年12月3日
	 */
	public static boolean isJSONObject(String str) {
		boolean status = false;

		try {
			if (StrUtil.isNotBlank(str)) {
				JSON.parseObject(str);
				status = true;
			}
		} catch (Exception e) {
			status = false;
		}

		return status;
	}

	/**
	 * 通用正则比较
	 * 
	 * @Description
	 * @author cc@bornsoft.cn
	 * @date 2020年4月14日
	 */
	public static boolean matches(String reg, String str) {
		if (str == null) {
			return false;
		}
		return str.matches(reg);
	}

	/**
	 * 小数点后1位
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author zhf
	 */
	public static boolean isDecimal(String str, Integer i) {
		boolean status = false;
		if (str != null) {
			String reg = "^\\d+(\\.\\d{" + i + "})?$";
			status = str.matches(reg);
		}
		return status;
	}

	/**
	 * 小数点后6位
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author zhf
	 */
	public static boolean isDecimal(String str, Integer min, Integer max) {
		boolean status = false;
		if (str != null) {
			String reg = "^\\d+(\\.\\d{" + min + "," + max + "})?$";
			status = str.matches(reg);
		}
		return status;
	}
	
	/**
	 * 小数，正数或负数
	 * 
	 * @title
	 * @param str
	 * @return
	 * @author cc
	 */
	public static boolean isNegativeDecimal(String str) {
		boolean status = false;
		if (str != null) {
			String reg = "^(\\-|\\+)?\\d+(\\.\\d+)?$";
			status = str.matches(reg);
		}
		return status;
	}

}
